import { error, fail, redirect } from '@sveltejs/kit'; import { getById } from '$lib/server/services/projects'; import { add, edit, archive, complete, loadProjectDashboard, loadArchived, } from '$lib/server/services/routines'; import { numericId, parseFormString } from '$lib/server/services/validation'; import { parseIntervalToDays } from '$lib/shared/routine-metrics'; import type { Actions, PageServerLoad } from './$types'; function parseFrequencyDays(value: FormDataEntryValue | null): number { const raw = value?.toString() ?? ''; const days = parseIntervalToDays(raw); if (days === null) { throw new Error('Invalid interval'); } return days; } export const load: PageServerLoad = async ({ params }) => { const id = numericId(params.id); const project = await getById(id); if (!project || project.archived) { throw error(404, 'Projet introuvable'); } const dashboard = await loadProjectDashboard(id, Date.now()); const archived = await loadArchived(id); return { project: { id: project.id, name: project.name }, routines: dashboard.routines, healthScore: dashboard.healthScore, archived, }; }; export const actions: Actions = { addRoutine: async ({ request, params }) => { const data = await request.formData(); const name = parseFormString(data.get('name')); if (!name) { return fail(400, { error: 'Le nom est requis' }); } try { await add( numericId(params.id), name, parseFrequencyDays(data.get('frequencyDays')), ); } catch { return fail(400, { error: 'Fréquence invalide' }); } return { success: true }; }, editRoutine: async ({ request }) => { const data = await request.formData(); const name = parseFormString(data.get('name')); if (!name) { return fail(400, { error: 'Le nom est requis' }); } try { await edit(numericId(data.get('id')), { name, frequencyDays: parseFrequencyDays(data.get('frequencyDays')), }); } catch { return fail(400, { error: 'Modification invalide' }); } return { success: true }; }, complete: async ({ request }) => { const data = await request.formData(); try { await complete( numericId(data.get('id')), parseFormString(data.get('note')), new Date().toISOString(), ); } catch { return fail(400, { error: 'Routine introuvable' }); } return { success: true }; }, archiveRoutine: async ({ request }) => { const data = await request.formData(); try { await archive(numericId(data.get('id'))); } catch { return fail(400, { error: 'Routine introuvable' }); } return { success: true }; }, archiveProject: async ({ params }) => { await archive(numericId(params.id)); throw redirect(303, '/'); }, };